package com.lyz.redis.service;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.ObjectUtils;

import java.util.Collection;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public abstract class RedisService<K,V> {

    protected final RedisTemplate<K,V> redisTemplate;

    RedisService(RedisTemplate<K, V> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 删除key相关数据
     * @param k
     */
    public void del(K k){
        redisTemplate.delete(k);
    }

    /**
     * 检查给定 key 是否存在。
     * @param k 键
     * @return boolean
     */
    public Boolean exists(K k){
        return redisTemplate.hasKey(k);
    }

    /**
     * 序列化给定 key ，并返回被序列化的值。
     * @param k 键
     * @return byte[]
     */
    public byte[] dump(K k){
        return redisTemplate.dump(k);
    }

    /**
     * 为给定 key 设置过期时间，以秒计。
     * @param k 键
     * @param seconds 时间（秒）
     */
    public Boolean expire(K k,long seconds){
        return this.expire(k,seconds, TimeUnit.SECONDS);
    }

    /**
     * 为给定 key 设置过期时间，以秒计。
     * @param k 键
     * @param seconds 时间（秒）
     * @param timeUnit 时间单位
     */
    public Boolean expire(K k,long seconds,TimeUnit timeUnit){
        return redisTemplate.expire(k,seconds, timeUnit);
    }

    /**
     *
     * @param k
     * @param date
     * @return
     */
    public Boolean expireAt(K k, Date date){
        return redisTemplate.expireAt(k,date);
    }

    /**
     * 获取匹配的key集合
     * @param pattern key
     * @return key 集合 Set
     */
    public Set<K> keys(K pattern){
        return redisTemplate.keys(pattern);
    }

    /**
     * 把key移动到指定的数据库
     * @param k 键
     * @param dbIndex 数据库索引
     * @return boolean
     */
    public Boolean move(K k,int dbIndex){
        return redisTemplate.move(k,dbIndex);
    }

    /**
     * 移除过期时间，永不过期
     * @param k 键
     * @return boolean
     */
    public Boolean persist(K k){
        return redisTemplate.persist(k);
    }

    /**
     * 获取过期时间
     * @param k 键
     * @param timeUnit 时间单位
     * @return long
     */
    public Long getExpire(K k,TimeUnit timeUnit){
        return redisTemplate.getExpire(k,timeUnit);
    }

    /**
     * 获取过期时间
     * @param k 键
     * @return 时间：（秒）
     */
    public Long getExpire(K k){
        return getExpire(k,TimeUnit.SECONDS);
    }

    /**
     * 修改key名称
     * @param k 原名称
     * @param k2 新名称
     */
    public void rename(K k,K k2){
        redisTemplate.rename(k,k2);
    }

    /**
     * 仅当 newKey 不存在时，将 key 改名为 newkey
     * @param k 原key名称
     * @param newKey 新key名称
     * @return boolean
     */
    public Boolean renameIfAbsent(K k,K newKey){
        return redisTemplate.renameIfAbsent(k,newKey);
    }
}
